package com.cll.learn.rabbitmq.service;

import com.cll.learn.rabbitmq.entity.Order;
import com.cll.learn.rabbitmq.util.AjaxResult;
import com.cll.learn.rabbitmq.vo.OrderGoodsVo;

import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * 描述信息:
 *
 * @author CLL
 * @version 1.0
 * @date 2021/2/23 16:34
 */
public interface OrderService {

    /**
     * 查询所有订单
     * @return  订单列表
     */
    List<Order> listAll();

    /**
     * 根据商品ID生成订单ID
     * 将生成的订单信息放入到订单队列，然后消费订单队列的消息，进行订单的持久化，持久化成功之后，确认消息
     * 确认消息成功之后，将订单ID写入超时队列，超时队列的消息不进行消费，超时之后自动进入死信队列
     * 最终所有消息都会写入死信队列，然后消费死信队列消息，进行数据持久化
     * 持久化的时候，如果订单已经支付，不进行操作
     * 如果订单没有支付，就修改订单的状态为超时取消
     * @param goodsId   商品ID
     * @return  订单信息
     */
    OrderGoodsVo generateOrder(int goodsId) throws ExecutionException, InterruptedException;

    /**
     * 支付之后提交订单
     * @param orderId   订单ID
     * @return  提交订单结果
     */
    AjaxResult<String> submitOrder(String orderId);

    /**
     * 超时取消订单
     * @param orderId   订单ID
     * @return  取消订单结果
     */
    AjaxResult<String> cancelOrder(String orderId);
}
